#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

// 取消处理函数（保安）
void routine(void *arg)
{
	// 释放资源的代码
	printf("我是保安，我拿到了钥匙=%s\n", (char *)arg);
}

// 线程任务函数
void *func(void *arg)
{
	// 压栈处理函数
	pthread_cleanup_push(routine, (void *)"key");
	// while (1)
	// {
		printf("我是子线程\n");
		// sleep(1);
	// }
	// 释放资源的代码
	// 弹栈处理函数
	pthread_cleanup_pop(0); // 出栈不执行取消函数的例程
	// 退出子线程
	pthread_exit(NULL);
}

int main(int argc, char const *argv[])
{
	// 定义线程id
	pthread_t tid;
	pthread_create(&tid, NULL, func, NULL);
	// 延时5s取消子线程
	printf("正在使用主线程\n");
	sleep(5);
	pthread_cancel(tid);
	printf("正在取消子线程\n");

	// 回收子线程
	pthread_join(tid, NULL);
	
	return 0;
}
